#!/usr/bin/python
# -*- coding: utf8 -*-
#Programa: cataleg.py
#Fecha: 14/10/2010
#Última modificación: 17/10/2010
#Autor: Iván Viguera
#Descripción:
#   Programa que permet realitzar el manteniment d'un catàleg de productes

#----Funciones----

#---Clases---
class cataleg:
    #---Métodos---
    def __init__(self):
        self.productes = dict()
        self.salir = False
    
    ##a. buida el catàleg. (demana confirmació)
    def removeAll(self):
        if self.__missatgeConfirmacio__():
            self.productes.clear()
    
    ##b. consulta un producte a partir de la seva clau. (si existeix mostra les 
    ##dades. Sinó existeix avisa que no hi és)
    def consultaElement(self):
        print self.productes.setdefault(raw_input("Clau Producte: "),"No hi és.")

    ##c. afegeix un producte. (demana les dades necessàries. Si la clau ja 
    ##existeix avisa de l'error)
    def addElement(self):
        key = self.__demanaClauProducte__()
        if key in self.productes.keys():
            print "Error, la clau ja existeix"
            return
    
        try : 
            self.productes[key] = [raw_input("Nom Producte: "),int(raw_input("Preu Producte: "))]
        except Exception, e:
            print e
            
##    d. modifica les dades d'un producte. (si no existeix avisa de l'error)
    def modificarElement(self):
        key = self.__demanaClauProducte__()
        if key not in self.productes.keys():
            print "Error, la clau no existeix."
            return
        try : 
            self.productes[key] = [raw_input("Nom Producte: "),int(raw_input("Preu Producte: "))]
        except Exception, e:
            print e

    ##e. elimina un producte. (si no existeix avisa de l'error. Demana confirmació)
    def eliminaElement(self):
        key = self.__demanaClauProducte__()
        if key not in self.productes.keys():
            print "Error, la clau no existeix."
            return
        if self.__missatgeConfirmacio__():
            self.productes.pop(key)
            
    ##f. indica quants productes hi ha al catàleg
    def quantitatElements(self):
        print len(self.productes)

    ##g. mostra les dades de tots els productes. (si no hi ha cap, ho indica)
    def printDades(self):
        if len(self.productes) == 0:
            print 'No hi ha cap producte.'
            return
        print 'Codi Nom Preu'
        for elem in self.productes.keys():
            print elem, self.productes[elem][0], self.productes[elem][1]
        
    ##h. mostra els productes amb un preu (<, <=, ==, =>, >) que un determinat.
    ##(demana el preu de referència i la relació. Si no hi ha cap, ho indica)
    def rangPreus(self):
        relacio = ('1. Menor.',
                   '2. Menor o igual.',
                   '3. Igual.',
                   '4. Major o igual.',
                   '5. Major.')
        for op in relacio:
            print op
        accions = dict({'1':self.__menor__,
                        '2':self.__menorIgual__,
                        '3':self.__igual__,
                        '4':self.__mayorIgual__,
                        '5':self.__mayor__})
        accions.get(raw_input('Opció: '))(int(raw_input('Preu referència: ')))
        
    ##i. mostra els productes que el seu nom contingui el patró de busqueda.
    def findParaula(self):
        patro = raw_input('Patró a buscar: ')
        for elem in self.productes.values():
            if elem[0].find(patro) > -1 :
                print elem[0]

    ##x. Demana confirmaciÃ³ de sortida i, si confirma, finalitza l'execuciÃ³ del programa.
    def sortir(self):
        self.salir = self.__missatgeConfirmacio__()

    #Retorna True/False segons el que hagi introduÃ¯t l'usuari.    
    def __missatgeConfirmacio__(self):
        resp = raw_input("Confirmar acció[s]: ")
        return resp is "s"

    def __demanaClauProducte__(self):
        return raw_input("Clau del Producte: ")

    ##Els següents mètodes fan una comparació sobre una referència.
    ##Mostren els elements que ho acompleixin. Dòna un missatge informatiu
    ##en cas que no s'hagi trobat cap element.
    def __menor__(self, relacio):
        aux = []
        for elem in self.productes.values():
            if elem[1]< relacio :
                aux.append(elem[0])
        if len(aux) == 0 :
            print 'No hi ha cap element que compleixi els requisits demanats.'
            return
        for elem in aux:
            print elem
            
    def __menorIgual__(self, relacio):
        aux = []
        for elem in self.productes.values():
            if elem[1]<= relacio :
                aux.append(elem[0])
        if len(aux) == 0 :
            print 'No hi ha cap element que compleixi els requisits demanats.'
            return
        for elem in aux:
            print elem
            
    def __igual__(self, relacio):
        aux = []
        for elem in self.productes.values():
            if elem[1] == relacio :
                aux.append(elem[0])
        if len(aux) == 0 :
            print 'No hi ha cap element que compleixi els requisits demanats.'
            return
        for elem in aux:
            print elem
            
    def __mayorIgual__(self, relacio):
        aux = []
        for elem in self.productes.values():
            if elem[1]>= relacio :
                aux.append(elem[0])
        if len(aux) == 0 :
            print 'No hi ha cap element que compleixi els requisits demanats.'
            return
        for elem in aux:
            print elem
            
    def __mayor__(self, relacio):
        aux = []
        for elem in self.productes.values():
            if elem[1]> relacio :
                aux.append(elem[0])
        if len(aux) == 0 :
            print 'No hi ha cap element que compleixi els requisits demanats.'
            return
        for elem in aux:
            print elem

#----Main----

opcionsMenu = ('a. buida catàleg',
               'b. consulta producte',
               'c. afegir producte.',
               'd. modificar producte.',
               'e. elimina producte.',
               'f. quantitat de productes',
               'g. mostrar dades dels productes.',
               'h. rang de preus.',
               'i. buscar producte',
               'x. sorit.')

c = cataleg()

#Define un switch con las opciones a partir del uso de diccionarios.
opciones = dict({'a':c.removeAll,
                 'b':c.consultaElement,
                 'c':c.addElement,
                 'd':c.modificarElement,
                 'e':c.eliminaElement,
                 'f':c.quantitatElements,
                 'g':c.printDades,
                 'h':c.rangPreus,
                 'i':c.findParaula,
                 'x':c.sortir})

while not c.salir :
    #pintar el menu
    for op in opcionsMenu:
        print op
    try:
        orden=opciones.get(raw_input("Opció: "))
        print ""*2
        orden()
    except:
        pass
    print ""*2
